前面已經建好基本的設定,現在來建置我們的第一個 Model Employer
,由於我們要做的是簡易的線上開店平台,所以一定會有老闆的角色,因此先把老闆的欄位設定好:
Employer | type | Foreign Key |
---|---|---|
first_name | String | |
last_name | String | |
age | Integer |
一開始先決定之後老闆的頁面會有哪些
<!-- 老闆列表頁 -->
http://127.0.0.1:8000/online/employer/
<!-- 新增老闆 C -->
http://127.0.0.1:8000/online/employer/create/
<!-- 老闆細節資訊頁 R -->
http://127.0.0.1:8000/online/employer/5
<!-- 更新老闆 U -->
http://127.0.0.1:8000/online/employer/5/update/
<!-- 刪除老闆 D -->
http://127.0.0.1:8000/online/employer/5/delete/
首先我們到 models.py
把 Employer
給建立完成
# online/models.py
from django.db import models
from django.urls import reverse
# Create your models here.
class Employer(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
age = models.PositiveIntegerField()
class Meta:
ordering = ['last_name', 'first_name']
def get_absolute_url(self):
return reverse('employer-detail', args=[str(self.id)])
def __str__(self):
return f'{self.first_name}-{self.last_name}'
詳細介紹一下這段在幹嘛:
url name
轉成連結 (如果忘記 url name 是什麼記得去看昨天的文章喔)first_name
、last_name
、age
first_name - last_name
PS. 如果覺得這些設定和方法很難懂的話,別擔心,我們後面會直接印出來給大家看,看這些方法到底在幹嘛
之前是寫 ROR 的看到這邊應該會不太習慣,因為 Django 是直接把資料表欄位一起寫在 models.py 檔案中,而不是
migration
檔案之中
這裡的 Meta 方法,它可以用來控制模型的行為和屬性,像是 Model 的排列順序和權限設定之類的事情,所以上面的意思就是,我先依照 last_name
排列,接著在按照 first_name
排列
ROR 中的 Order 物件排列就是可以加在這邊
假設今天我有一個 Employer
物件,我可以直接這樣寫 Employer.get_absolute_url
,最後我們可以直接得到 url name='employer-detail' 的連結
。
後面還要加上一段 self.id,是因為 detail 就是老闆 detail
頁面,連結會像這樣子 http://127.0.0.1:8000/online/employer/5
,這個連結裡面的 5 就是 self.id
Ps. 這樣寫還是很模糊,等等使用到會再提一次
這個方法是最重要的東西,前面兩個方法都可以不寫,但是這個不行,這個 __str__
就是今天當你印出一個 Employer
物件時,會自動顯示的格式,像我今天這樣寫,印出一個 Employer
就會是顯示老闆的 first_name - last_name
Ps. 這個一樣等等看範例會比較清楚
還記得我們前面具現化過一次表單嗎?不過這一次跟前面比起來,還要再多一個指令:
$ python3 manage.py makemigrations
------
Migrations for 'online':
online/migrations/0001_initial.py
- Create model Employer
$ python3 manage.py migrate
------
Operations to perform:
Apply all migrations: admin, auth, contenttypes, online, sessions
Running migrations:
Applying online.0001_initial... OK
第一個指令是確認 Model
的改變情況,第二個指令是實際具現化表單,這時候應該會有人有疑問,為啥會多了一個指令,其實就是 Django 為了保險起見你已經確認你想要具現化你的表單了
你可以實際這樣試試,先在 models.py 裡面新增一個 model:
# online/modes.py
class good(models.Model):
title = models.CharField(max_length=100)
def __str__(self):
return self.title
然後直接執行 migrate:
$ python3 manage.py migrate
------
Operations to perform:
Apply all migrations: admin, auth, contenttypes, online, sessions
Running migrations:
No migrations to apply.
Your models in app(s): 'online' have changes that are not yet reflected in a migration, and so won't be applied.
Run 'manage.py makemigrations' to make new migrations, and then re-run 'manage.py migrate' to apply them.
會發現系統叫你先執行 migration,再來執行 migrate!!!
Ps. 測試完後,記得要把這一段 class good
刪掉喔!!!
剛剛比較細心的人,應該有注意到我們具現化表單時候的文字:
$ python3 manage.py migrate
------
Operations to perform:
Apply all migrations: admin, auth, contenttypes, online, sessions
Running migrations:
Applying online.0001_initial... OK
有沒有注意到最後一句 - Applying online.0001_initial... OK
,這一句出現後,此時你再打開你的專案,資料夾結構應該會變成這樣:
多了一個 migration 檔案!接著我們點進 migration 資料夾裡面的 0001_initial.py
檔案:
# store/online/migrations/0001_initial.py
# Generated by Django 4.2.4 on 2023-09-04 05:07
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Employer',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('first_name', models.CharField(max_length=100)),
('last_name', models.CharField(max_length=100)),
('age', models.PositiveIntegerField()),
],
options={
'ordering': ['last_name', 'first_name'],
},
),
]
會發現這個檔案中,就是寫著我們剛剛新增 Employer Model
的資訊,也就是說,以後 migration
資料夾裡面,會有著我們資料庫變動的所有歷程!
寫過 ROR 的朋友們,應該非常熟悉,這個就跟 ROR 的 migration 有點像
今天學到哪些東西呢?
最後附上 Github: https://github.com/eagle0526/Django-store